﻿using System;
using System.Data;
using System.Linq;
using System.Collections.Generic;
using System.Web.UI.WebControls;
using Emporium_Web.Controls;
using Emporium_Web.Enums;
using Emporium_Web.DBML;
using System.Linq.Expressions;

namespace Emporium_Web
{
    public partial class ConsumosXEstilo : System.Web.UI.Page
    {
        /// <summary>
        /// Es el código de estilo
        /// </summary>
        private int EstiloId
        {
            get { return ViewState["RequestCodeEstilo"] == null ? -1 : (int)ViewState["RequestCodeEstilo"]; }
            set { ViewState["RequestCodeEstilo"] = value; }
        }

        /// <summary>
        /// Es el código de variante
        /// </summary>
        private int VarianteId
        {
            get { return ViewState["VarianteId"] == null ? -1 : (int)ViewState["VarianteId"]; }
            set { ViewState["VarianteId"] = value; }
        }
     
        /// <summary>
        /// Es el código de componente
        /// </summary>
        private int ComponenteId
        {
            get { return ViewState["ComponenteId"] == null ? -1 : (int)ViewState["ComponenteId"]; }
            set { ViewState["ComponenteId"] = value; }
        }

        /// <summary>
        /// Es el código de variante item
        /// </summary>
        private int VarianteItemId
        {
            get { return ViewState["VarianteItemId"] == null ? -1 : (int)ViewState["VarianteItemId"]; }
            set { ViewState["VarianteItemId"] = value; }
        }

        /// <summary>
        /// Los componentes.
        /// </summary>
        private List<DE_Componente> ComponentesTemp
        {
            get
            {
                return Session["ComponentesTemp"] == null ? null : (List<DE_Componente>)Session["ComponentesTemp"];
            }
            set
            {
                Session["ComponentesTemp"] = value;
            }
        }

        /// <summary>
        /// Los Variante Items.
        /// </summary>
        private List<DE_VarianteItem> VarianteItemsTemp
        {
            get
            {
                return Session["VarianteItemsTemp"] == null ? null : (List<DE_VarianteItem>)Session["VarianteItemsTemp"];
            }
            set
            {
                Session["VarianteItemsTemp"] = value;
            }
        }

        protected void Page_Init(object sender, EventArgs e)
        {
            componenteAdd.agregarClick += new EventHandler(agregarComponente_Click);            
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            warningMessage.Visible = false;
            errorMessage.Visible = false;

            if (!IsPostBack)
            {
                Master.ActualizaMenu(MenuPrincipal.Desarrollo, (int)MenuDesarrollo.Estilo);
                Master.AgregarBreadcrumb("Estilos", "#", true);
                Master.AgregarBreadcrumb("Listado", "EstiloList.aspx", false);
                Master.AgregarBreadcrumb("Consumos", "#", false);

                int EstiloId = 0;
                if (Request.QueryString["EstiloId"] != null && Int32.TryParse(Request.QueryString["EstiloId"], out EstiloId))
                {
                    this.EstiloId = EstiloId;
                    TablasDataContext database = new TablasDataContext();

                    var estilo = (from estilos in database.DE_Estilo
                                  where estilos.Id == EstiloId
                                  select estilos).First();

                    this.txtEstilo.Text = estilo.Descripcion;
                }

                int VarianteId = 0;
                if (Request.QueryString["VarianteId"] != null && Int32.TryParse(Request.QueryString["VarianteId"], out VarianteId))
                {
                    this.VarianteId = VarianteId;
                }
                int ComponenteId = 0;
                if (Request.QueryString["ComponenteId"] != null && Int32.TryParse(Request.QueryString["ComponenteId"], out ComponenteId))
                {
                    this.ComponenteId = ComponenteId;
                }
                int VarianteItemId = 0;
                if (Request.QueryString["VarianteItemId"] != null && Int32.TryParse(Request.QueryString["VarianteItemId"], out VarianteItemId))
                {
                    this.VarianteItemId = VarianteItemId;
                }

                ComponentesTemp = new List<DE_Componente>();
                ListarVariantes();

                ComponentesTemp = new List<DE_Componente>();
                if (gvVariantes.SelectedIndex > -1)
                    this.VarianteId = (int)gvVariantes.DataKeys[gvVariantes.SelectedIndex]["Variante_Id"];
                else
                    this.VarianteId = 0;

                ListarComponentes();
                CargarComponentes();
                ActualizarSeleccionGrillaVariantes();

                VarianteItemsTemp = new List<DE_VarianteItem>();
                if (gvComponentes.SelectedIndex > -1)
                    this.ComponenteId = (int)gvComponentes.DataKeys[gvComponentes.SelectedIndex]["Componente_Id"];
                else
                    this.ComponenteId = 0;

                ListarVarianteItems();
                CargarVarianteItems();
                ActualizarSeleccionGrillaComponentes();               
            }
        }

        private void ListarVariantes()
        {
            TablasDataContext database = new TablasDataContext();

            var listaVariantes = (from variantes in database.DE_Variante
                                  where (variantes.Estilo_Id == EstiloId)
                                  select variantes);

            if (listaVariantes.Count() > 0)
            {               
                gvVariantes.DataSource = listaVariantes;
                gvVariantes.DataBind();

                if (this.VarianteId > 0)
                    gvVariantes.SelectedIndex = listaVariantes.ToList().IndexOf(listaVariantes.ToList().Find(c => c.Variante_Id == this.VarianteId));
                else
                    gvVariantes.SelectedIndex = 0;

            }
            else
            {
                gvVariantes.DataSource = new List<DE_Variante>() { new DE_Variante() };
                gvVariantes.DataBind();
                gvVariantes.Rows[0].Cells[0].Text = string.Empty;
                gvVariantes.Rows[0].Cells[1].Text = string.Empty;

                btnComponentesAdicionar.Visible = false;
                btnComponentesEliminar.Visible = false;
                btnComponentesGrabar.Visible = false;
            }
        }

        private void ListarComponentes()
        {
            TablasDataContext database = new TablasDataContext();

            var listaComponentes = from componentes in database.DE_Componente
                                   join varianteComponentes in database.DE_VarianteComponente
                                   on componentes.Componente_Id equals varianteComponentes.Componente_Id
                                   where varianteComponentes.Variante_Id == this.VarianteId
                                   select componentes;

            ComponentesTemp = listaComponentes.ToList();
        }

        private void ListarVarianteItems()
        {
            TablasDataContext database = new TablasDataContext();

            var listaVarianteItems = from varianteItems in database.DE_VarianteItem
                                     where varianteItems.Variante_Id == this.VarianteId
                                        && varianteItems.Componente_Id == this.ComponenteId
                                     select varianteItems;
            
            VarianteItemsTemp = listaVarianteItems.ToList();
            
        }

        private void CargarComponentes()
        {
            if (ComponentesTemp.Count() > 0)
            {                
                gvComponentes.DataSource = ComponentesTemp;
                gvComponentes.DataBind();
                if (this.ComponenteId > 0)
                    gvComponentes.SelectedIndex = ComponentesTemp.IndexOf(ComponentesTemp.Find(c => c.Componente_Id == this.ComponenteId));
                else
                    gvComponentes.SelectedIndex = 0;
            }
            else
            {
                gvComponentes.DataSource = new List<DE_Componente>() { new DE_Componente() };
                gvComponentes.DataBind();
                gvComponentes.Rows[0].Cells[0].Text = string.Empty;
                gvComponentes.Rows[0].Cells[1].Text = string.Empty;
            }
        }

        private void CargarVarianteItems()
        {
            if (VarianteItemsTemp.Count() > 0)
            {
                gvItems.DataSource = VarianteItemsTemp;
                gvItems.DataBind();

                if (this.VarianteItemId > 0)
                    gvItems.SelectedIndex = VarianteItemsTemp.IndexOf(VarianteItemsTemp.Find(c => c.Variante_Id == this.VarianteItemId));
                else
                    gvItems.SelectedIndex = 0;
            }
            else
            {
                gvItems.DataSource = new List<DE_VarianteItem>() { new DE_VarianteItem() };
                gvItems.DataBind();
                gvItems.Rows[0].Cells[0].Text = string.Empty;
                gvItems.Rows[0].Cells[1].Text = string.Empty;
                gvItems.Rows[0].Cells[2].Text = string.Empty;
                gvItems.Rows[0].Cells[3].Text = string.Empty;
                gvItems.Rows[0].Cells[4].Text = string.Empty;
                gvItems.Rows[0].Cells[5].Text = string.Empty;                
            }
        }

        protected void gvVariantes_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                Label lblEstado = (Label)e.Row.FindControl("lblEstado");
                if (lblEstado != null && lblEstado.Text != string.Empty)
                {
                    lblEstado.Text = lblEstado.Text.ToString()[0] == 'R' ? "REGISTRADO" : "OPERATIVO";
                }
            }
        }

        protected void btnAdicionar_Click(object sender, EventArgs e)
        {
            try
            {
                if (VarianteId > 0 && ComponenteId > 0)
                {
                    TablasDataContext database = new TablasDataContext();
                    var listaComponente = database.DE_VarianteComponente.FirstOrDefault(c => c.Variante_Id == this.VarianteId && c.Componente_Id == this.ComponenteId);

                    if (listaComponente == null)
                    {
                        warningMessage.Visible = true;
                        lblWarningMessage.Text = "Debe grabar Componente seleccionado";
                        return;
                    }

                    Response.Redirect("ItemsForm.aspx?Operacion=" + (int)AccionesForm.Adicionar + "&VarianteId=" + VarianteId + "&ComponenteId=" + ComponenteId + "&EstiloId=" + EstiloId);
                }
                else
                {
                    warningMessage.Visible = true;
                    lblWarningMessage.Text = Resources.MensajesValidacion.RequiredVarianteComponente;
                }
            }
            catch (Exception x)
            {
                lblErrorMessage.Text = x.Message;
                errorMessage.Visible = true;
            }
        }

        protected void btnModificar_Click(object sender, EventArgs e)
        {
            try
            {
                int codigo = 0;
                if (Int32.TryParse(hdnSeleccion.Value.ToString(), out codigo))
                {
                    Response.Redirect("ItemsForm.aspx?Operacion=" + (int)AccionesForm.Modificar + "&VarianteId=" + VarianteId + "&ComponenteId=" + ComponenteId + "&EstiloId=" + EstiloId + "&VarianteItemId=" + codigo);
                }
                else
                {
                    warningMessage.Visible = true;
                    lblWarningMessage.Text = Resources.MensajesValidacion.NoItemSelected;
                }                
            }
            catch (Exception x)
            {
                lblErrorMessage.Text = x.Message;
                errorMessage.Visible = true;
            }
        }

        protected void btnConsultar_Click(object sender, EventArgs e)
        {
            try
            {
                int codigo = 0;
                if (Int32.TryParse(((LinkButton)sender).Text, out codigo))
                {
                    Response.Redirect("ItemsForm.aspx?Operacion=" + (int)AccionesForm.Consultar + "&VarianteId=" + VarianteId + "&ComponenteId=" + ComponenteId + "&EstiloId=" + EstiloId + "&VarianteItemId=" + codigo);
                }
                else
                {
                    warningMessage.Visible = true;
                    lblWarningMessage.Text = Resources.MensajesValidacion.NoItemSelected;
                }
            }
            catch (Exception x)
            {
                lblErrorMessage.Text = x.Message;
                errorMessage.Visible = true;
            }
        }

        protected void btnColores_Click(object sender, EventArgs e)
        {
            try
            {
                int codigo = 0;
                if (Int32.TryParse(hdnSeleccion.Value.ToString(), out codigo))
                {
                    Response.Redirect("ColoresItemForm.aspx?VarianteId=" + VarianteId + "&ComponenteId=" + ComponenteId + "&EstiloId=" + EstiloId + "&VarianteItemId=" + codigo);
                }
                else
                {
                    warningMessage.Visible = true;
                    lblWarningMessage.Text = Resources.MensajesValidacion.NoItemSelected;
                }
            }
            catch (Exception x)
            {
                lblErrorMessage.Text = x.Message;
                errorMessage.Visible = true;
            }
        }

        protected void btnEliminar_Click(object sender, EventArgs e)
        {
            try
            {
                int codigo = 0;
                if (Int32.TryParse(hdnSeleccion.Value.ToString(), out codigo))
                {

                    TablasDataContext database = new TablasDataContext();

                    var colores = (from varianteItemsCombinacionColor in database.DE_VarianteItemCombinacionColor
                                        where varianteItemsCombinacionColor.VarIte_Id == codigo
                                        select varianteItemsCombinacionColor);

                    foreach (var item in colores)
                    {
                        database.DE_VarianteItemCombinacionColor.DeleteOnSubmit(item);  
                    }

                    var varianteItem = (from varianteItems in database.DE_VarianteItem
                                  where varianteItems.VarIte_Id == codigo
                                  select varianteItems).FirstOrDefault();

                    if (varianteItem != null)
                    {
                        database.DE_VarianteItem.DeleteOnSubmit(varianteItem);                        
                    }

                    database.SubmitChanges();
                    ListarVarianteItems();
                    CargarVarianteItems();
                }
                else
                {
                    warningMessage.Visible = true;
                    lblWarningMessage.Text = Resources.MensajesValidacion.NoItemSelected;
                }
            }
            catch (Exception x)
            {
                lblErrorMessage.Text = x.Message;
                errorMessage.Visible = true;
            }
        }

        protected void gvPagerPageChanged(object sender, DataNavigatorEventArgs e)
        {
        }
        
        private void ListarEstilos()
        {
        }

        private void Eliminar()
        {
        }      

        protected void btnAtras_Click(object sender, EventArgs e)
        {
            Response.Redirect("EstiloList.aspx");
        }

        protected void gvVariantes_SelectedIndexChanged(object sender, EventArgs e)
        {
            ComponentesTemp = new List<DE_Componente>();
            this.VarianteId = (int)gvVariantes.DataKeys[gvVariantes.SelectedIndex]["Variante_Id"];           
            ListarComponentes();           
            CargarComponentes();
            if (ComponentesTemp.Count > 0)
                gvComponentes.SelectedIndex = 0;

            if (gvComponentes.SelectedIndex > -1 && ComponentesTemp.Count > 0)
                this.ComponenteId = (int)gvComponentes.DataKeys[gvComponentes.SelectedIndex]["Componente_Id"];
            else
                this.ComponenteId = 0;

            ActualizarSeleccionGrillaComponentes();           

            VarianteItemsTemp = new List<DE_VarianteItem>();
            ListarVarianteItems();
            CargarVarianteItems();
            ActualizarSeleccionGrillaVariantes();
        }

        private void ActualizarSeleccionGrillaVariantes()
        {
            if (gvVariantes.SelectedIndex > -1)
                foreach (GridViewRow row in gvVariantes.Rows)
                {
                    ImageButton img = (ImageButton)row.Cells[0].Controls[0];
                    if ((row.RowIndex == gvVariantes.SelectedIndex))
                    {
                        img.ImageUrl = @"~/images/selected.png";
                    }
                    else
                    {
                        img.ImageUrl = @"~/images/unselected.png";
                    }
                }
        }

        private void ActualizarSeleccionGrillaComponentes()
        {
            if (gvComponentes.SelectedIndex > -1)
                foreach (GridViewRow row in gvComponentes.Rows)
                {
                    if (row.Cells[0].Controls.Count > 0)
                    {
                        ImageButton img = (ImageButton)row.Cells[0].Controls[0];
                        if ((row.RowIndex == gvComponentes.SelectedIndex))
                        {
                            img.ImageUrl = @"~/images/selected.png";
                        }
                        else
                        {
                            img.ImageUrl = @"~/images/unselected.png";
                        }
                    }
                }
        }

        protected void btnComponentesAdicionar_Click(object sender, EventArgs e)
        {
            componenteAdd.ListarComponentes();
        }

        protected void btnComponentesEliminar_Click(object sender, EventArgs e)
        {
            try
            {
                this.ComponenteId = (int)gvComponentes.DataKeys[gvComponentes.SelectedIndex]["Componente_Id"];
                if (ComponenteId > 0)
                {
                    var talla = ComponentesTemp.Find(c => c.Componente_Id == ComponenteId);
                    ComponentesTemp.Remove(talla);
                    CargarComponentes();
                    ActualizarSeleccionGrillaComponentes();

                    if (ComponentesTemp.Count > 0)
                    {
                        gvVariantes.SelectedIndex = 0;
                        this.VarianteId = (int)gvVariantes.DataKeys[gvVariantes.SelectedIndex]["Variante_Id"]; 

                        VarianteItemsTemp = new List<DE_VarianteItem>();
                        if (gvComponentes.SelectedIndex > -1)
                            this.ComponenteId = (int)gvComponentes.DataKeys[gvComponentes.SelectedIndex]["Componente_Id"];
                        else
                            this.ComponenteId = 0;

                        ListarVarianteItems();
                        CargarVarianteItems();
                        ActualizarSeleccionGrillaVariantes();
                    }
                    hdnSeleccionCmp.Value = string.Empty;
                }
                else
                {
                    warningMessage.Visible = true;
                    lblWarningMessage.Text = Resources.MensajesValidacion.NoItemSelected;
                }
            }
            catch (Exception x)
            {
                lblErrorMessage.Text = x.Message;
                errorMessage.Visible = true;
            }
        }      

        protected void btnComponentesGrabar_Click(object sender, EventArgs e)
        {
            try
            {

                TablasDataContext database = new TablasDataContext();
                var componentesActuales = from componentes in database.DE_Componente
                                            join varianteComponentes in database.DE_VarianteComponente
                                            on componentes.Componente_Id equals varianteComponentes.Componente_Id
                                            where varianteComponentes.Variante_Id == this.VarianteId
                                            select varianteComponentes;

                //Se elimana las combinaciones              

                foreach (var item in componentesActuales)
                {
                    if (!ComponentesTemp.Exists(c => c.Componente_Id == item.Componente_Id))
                    {
                        var colores = (from combinacionColor in database.DE_VarianteItemCombinacionColor
                                       where combinacionColor.Componente_Id == item.Componente_Id
                                       select combinacionColor);
                        foreach (var itemX in colores)
                        {
                            database.DE_VarianteItemCombinacionColor.DeleteOnSubmit(itemX);
                        }

                        var items = (from varianteItems in database.DE_VarianteItem
                                     where varianteItems.Componente_Id == item.Componente_Id
                                     select varianteItems);
                        foreach (var itemX in items)
                        {
                            database.DE_VarianteItem.DeleteOnSubmit(itemX);                           
                        }

                        database.DE_VarianteComponente.DeleteOnSubmit(item);
                        database.SubmitChanges();
                    }
                }

                //Se insertan las combinaciones
                foreach (var itemTemp in ComponentesTemp)
                {
                    var combinacion = database.DE_VarianteComponente.FirstOrDefault(c => c.Componente_Id == itemTemp.Componente_Id && c.Variante_Id == this.VarianteId);
                    if (combinacion == null)
                    {
                        database.DE_VarianteComponente.InsertOnSubmit(new DE_VarianteComponente()
                        {
                            Variante_Id = this.VarianteId,
                            Componente_Id = itemTemp.Componente_Id
                        });
                    }
                }
                database.SubmitChanges();
                CargarComponentes();
                lblWarningMessage.Text = "Componentes fueron guardadas exitosamente.";
                warningMessage.Visible = true;
            }
            catch (Exception x)
            {
                lblErrorMessage.Text = x.Message;
                errorMessage.Visible = true;
            }
        }

        protected void agregarComponente_Click(object sender, EventArgs e)
        {
            TablasDataContext database = new TablasDataContext();

            var componente = database.DE_Componente.First(c => c.Componente_Id == componenteAdd.CodigoSeleccionado);

            if (!ComponentesTemp.Exists(c => c.Componente_Id == componenteAdd.CodigoSeleccionado))
            {
                ComponentesTemp.Add(componente);                
                CargarComponentes();
             }
        }

        protected void gvComponentes_SelectedIndexChanged(object sender, EventArgs e)
        {
            VarianteItemsTemp = new List<DE_VarianteItem>();
            this.ComponenteId = (int)gvComponentes.DataKeys[gvComponentes.SelectedIndex]["Componente_Id"];
            ListarVarianteItems();
            CargarVarianteItems();
            ActualizarSeleccionGrillaComponentes();
        }

        protected void gvItems_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                Label lblVarianteItem = (Label)e.Row.FindControl("lblItemId");
                
                TablasDataContext database = new TablasDataContext();
                var listaVarianteItem = database.DE_VarianteItem.FirstOrDefault(c=>c.VarIte_Id == Convert.ToInt32(lblVarianteItem.Text));

                if (listaVarianteItem != null)
                {
                    if (listaVarianteItem.Item_Id != null)
                    {
                        lblVarianteItem.Text = listaVarianteItem.TG_Item.Item_Id.ToString("00000");
                    }
                    if (listaVarianteItem.Tela_Id != null)
                    {
                        lblVarianteItem.Text = listaVarianteItem.TG_Tela.Tela_Id.ToString("00000");
                    }

                    Label lblVarianteItemDesc = (Label)e.Row.FindControl("lblItemDescripcion");
                    if (listaVarianteItem.Item_Id != null)
                    {
                        lblVarianteItemDesc.Text = listaVarianteItem.TG_Item.Item_Descripcion;
                    }
                    if (listaVarianteItem.Tela_Id != null)
                    {
                        lblVarianteItemDesc.Text = listaVarianteItem.TG_Tela.Tela_Descripcion;
                    }
                }
            }
        }       

    }
}